﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Fuyao.Business.Entities.Models;
using Fuyao.Business.Logic.BC;
using Fuyao.Win.UI.Util;
using Fuyao.Win.UI.Common;

namespace Fuyao.Win.UI.Mantenimientos
{
    public partial class frmClientes : Form
    {
        BusinessLogic bc = new BusinessLogic();

        #region Propiedades
        public bool action { get; set; }
        public Cliente beCliente { get; set; }
        public int ClienteID { get; set; }
        #endregion        

        public frmClientes()
        {
            InitializeComponent();
        }

        private void frmClientes_Load(object sender, EventArgs e)
        {
            loadUI();
        }

        private void loadUI()
        {
            loadDefaultInformation();
            if (ClienteID == 0) newCliente();
            else editCliente();
        }

        private void newCliente()
        {
            beCliente = new Cliente();
            beCliente.Direccions = new List<Direccion>();
            beCliente.CreadoPor = VariablesGlobales.GlobalEnUsuario.UsuarioID;
        }

        private void loadDefaultInformation()
        {
            action = false;
            this.cboEstado.SelectedIndex = 0;
            Utilitarios.configurarGrilla(ref dgvAddressCliente);
            setColumnasGrilla();
            cargarCboVendedores();
            cargarCboDepartamentos();
            if (ClienteID == 0)
            {
                this.cboEstado.Enabled = false;
                this.Text = "NUEVO CLIENTE";
            }
            else
            {
                this.cboEstado.Enabled = true;
                this.Text = "EDITAR CLIENTE";
            }
        }       

        private void editCliente()
        {
            beCliente = bc.getClienteByClienteID(ClienteID);
            cargarDatosCliente(beCliente);
        }

        private void cargarDatosCliente(Cliente beCliente)
        {
            this.txtCodigoCliente.Text = beCliente.CodigoCliente;
            this.txtCodigoCliente.Tag = beCliente.ClienteID;
            this.txtNombresCliente.Text = beCliente.NombreCliente;
            this.txtRucCliente.Text = beCliente.RUC;
            this.txtDNI.Text = beCliente.DNI;
            this.txtTelefonoCliente.Text = beCliente.Telefono;
            this.cboEstado.SelectedIndex = (beCliente.Estado == true ? 0 : 1);
            this.cboVendedorCliente.SelectedValue = beCliente.VendedorID == null ? 0 : beCliente.VendedorID;
            this.dgvAddressCliente.DataSource = null;
            this.dgvAddressCliente.DataSource = beCliente.Direccions;
        }

        private Cliente llenarEntidad()
        {            
            beCliente.ClienteID = ClienteID;
            beCliente.CodigoCliente = this.txtCodigoCliente.Text.Trim();
            beCliente.NombreCliente = this.txtNombresCliente.Text.Trim();
            beCliente.DNI = this.txtDNI.Text.Trim();
            beCliente.RUC = this.txtRucCliente.Text.Trim();
            beCliente.Telefono = this.txtTelefonoCliente.Text.Trim();
            beCliente.Estado = this.cboEstado.SelectedIndex == 0 ? true : false;
            beCliente.VendedorID = Convert.ToInt32(this.cboVendedorCliente.SelectedValue);
            beCliente.CreadoPor = VariablesGlobales.GlobalEnUsuario.UsuarioID;
            return beCliente;
        }

        private void cargarCboVendedores()
        {
            Utilitarios.cargarCboVendedores(this.cboVendedorCliente);
        }

        private void cargarCboDepartamentos()
        {
            Utilitarios.cargarCboDepartamento(this.cboDepartamento);
        }

        private void frmClientes_KeyPress(object sender, KeyPressEventArgs e)
        {
            Utilitarios.cerrarFormularioEscape(e, this);
        }

        private void txt_KeyPress(object sender, KeyPressEventArgs e)
        {
            Utilitarios.vSoloNumeros(e);
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            if (ClienteID == 0)
            {
                foreach (Control c in groupBox1.Controls) if (c is TextBox) ((TextBox)c).Text = string.Empty;
                this.cboVendedorCliente.SelectedIndex = 0;
                this.cboDepartamento.SelectedIndex = 0;
                this.cboProvincia.DataSource = null;
                this.cboDistrito.DataSource = null;                
                this.txtDireccion.Text = string.Empty;
                this.dgvAddressCliente.DataSource = null;
                newCliente();
            }
            else resetDatosControles(); //else:Edit    
        }

        private void resetDatosControles()
        {
            beCliente = bc.getClienteByClienteID(ClienteID);
            cargarDatosCliente(beCliente);
        }

        private void btnGrabar_Click(object sender, EventArgs e)
        {
            if (validarCamposRequeridos())
            {
                if (ClienteID == 0) //true:Insert
                {
                    ClienteID = bc.InsertCliente(llenarEntidad());
                    if (ClienteID > 0)
                    {
                        MessageBox.Show("Se ingresaron los datos correctamente", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        cerrarForm();
                    }
                    else
                        MessageBox.Show("Error al ingresar los datos, contacte con Sistemas", "Sistema FUYAO - Mensaje de Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
                else //true:Editar
                {
                    if (bc.UpdateCliente(llenarEntidad()))
                    {
                        MessageBox.Show("Se actualizaron los datos correctamente", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        cerrarForm();
                    }
                    else
                        MessageBox.Show("Error al actuallizar los datos, contacte con Sistemas", "Sistema FUYAO - Mensaje de Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        }

        private bool validarCamposRequeridos()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("Ingrese los campos requeridos: " + System.Environment.NewLine);

            bool isValid = true;           

            if (String.IsNullOrEmpty(txtNombresCliente.Text))
            {
                sb.Append("- Nombre del cliente" + System.Environment.NewLine);
                ErrorProv.SetError(txtNombresCliente, "Ingrese el nombre del cliente");
                isValid = false;
            }          
          
            if (cboVendedorCliente.SelectedIndex == 0 || cboVendedorCliente.SelectedIndex == -1)
            {
                sb.Append("- Seleccione el vendedor del cliente" + System.Environment.NewLine);
                ErrorProv.SetError(cboVendedorCliente, "Seleccione el vendedor del cliente");
                isValid = false;
            }

            if (this.dgvAddressCliente.Rows.Count == 0)
            {
                sb.Append("- Ingrese por lo menos una dirección para el cliente" + System.Environment.NewLine);                
                isValid = false;
            }

            if (!isValid)
                MessageBox.Show(sb.ToString(), "Sistema FUYAO - Validando opción", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

            return isValid;
        }

        private void cerrarForm()
        {
            this.Close();
            action = true;
        }

        private void cboVendedorCliente_SelectedIndexChanged(object sender, EventArgs e)
        {
            ErrorProv.SetError(cboVendedorCliente, "");
        }

        private void txt_TextChanged(object sender, EventArgs e)
        {            
            TextBox tbx = (TextBox)sender;
            ErrorProv.SetError(tbx, "");
        }

        private void cboProvincia_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboProvincia.SelectedIndex > 0)
            {
                Utilitarios.cargarCboDistrito(this.cboDistrito, Convert.ToInt32(cboProvincia.SelectedValue));
                ErrorProv.SetError(this.cboProvincia, "");
            }
        }

        private void cboDepartamento_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboDepartamento.SelectedIndex > 0)
            {
                this.cboProvincia.DataSource = null;
                this.cboDistrito.DataSource = null;
                Utilitarios.cargarCboProvincia(this.cboProvincia, Convert.ToInt32(cboDepartamento.SelectedValue));
                ErrorProv.SetError(this.cboDepartamento, "");                
            }
        }        

        private bool validaIngresoAddress()
        {
            bool isValid = true;

            if (this.cboDepartamento.SelectedIndex == 0 || this.cboDepartamento.SelectedIndex == -1)
            {
                ErrorProv.SetError(this.cboDepartamento, "Seleccione el departamento");
                isValid = false;
            }

            if (this.cboProvincia.SelectedIndex == 0 || this.cboProvincia.SelectedIndex == -1)
            {
                ErrorProv.SetError(this.cboProvincia, "Seleccione la provincia");
                isValid = false;
            }

            if (this.cboDistrito.SelectedIndex == 0 || this.cboDistrito.SelectedIndex == -1)
            {
                ErrorProv.SetError(this.cboDistrito, "Seleccione el distrito");
                isValid = false;
            }

            if (String.IsNullOrEmpty(txtDireccion.Text))
            {
                ErrorProv.SetError(txtDireccion, "Ingrese la dirección del cliente");
                isValid = false;
            }

            return isValid;
        }

        private void btnAddDireccion_Click(object sender, EventArgs e)
        {
            if (validaIngresoAddress())
            {
                if (beCliente.Direccions.Count == 0) beCliente.Direccions = new List<Direccion>();

                Direccion oDetalleAddress = new Direccion();
                oDetalleAddress.ClienteID = ClienteID;
                oDetalleAddress.Direccion1 = this.txtDireccion.Text.Trim();
                oDetalleAddress.DepartamentoID = Convert.ToInt32(this.cboDepartamento.SelectedValue);
                oDetalleAddress.DepartamentoDesc = this.cboDepartamento.Text.ToString();
                oDetalleAddress.ProvinciaID = Convert.ToInt32(this.cboProvincia.SelectedValue);
                oDetalleAddress.ProvinciaDesc = this.cboProvincia.Text.ToString();
                oDetalleAddress.DistritoID = Convert.ToInt32(this.cboDistrito.SelectedValue);
                oDetalleAddress.DistritoDesc = this.cboDistrito.Text.ToString();
                oDetalleAddress.EsPrincipal = (dgvAddressCliente.Rows.Count == 0 ? true : false);
                oDetalleAddress.IsPrincipalDesc = (oDetalleAddress.EsPrincipal ? "SI" : "NO");

                beCliente.Direccions.Add(oDetalleAddress);
                dgvAddressCliente.DataSource = null;
                dgvAddressCliente.DataSource = beCliente.Direccions;
                this.txtDireccion.Text = string.Empty;
            }
        }        

        private void setColumnasGrilla()
        {
            ColDireccionID.DataPropertyName = "DireccionID";
            ColDireccion.DataPropertyName = "Direccion1";
            ColClienteID.DataPropertyName = "ClienteID";
            ColDepartamentoID.DataPropertyName = "DepartamentoID";
            ColDepartamento.DataPropertyName = "DepartamentoDesc";
            ColProvinciaID.DataPropertyName = "ProvinciaID";
            ColProvincia.DataPropertyName = "ProvinciaDesc";
            ColDistritoID.DataPropertyName = "DistritoID";
            ColDistrito.DataPropertyName = "DistritoDesc";
            ColEsPrincipal.DataPropertyName = "EsPrincipal";
            ColIsPrincipalDesc.DataPropertyName = "IsPrincipalDesc";
        }

        private void cboDistrito_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboDistrito.SelectedIndex > 0) ErrorProv.SetError(this.cboDistrito, "");
        }

        private void btnQuitarDireccion_Click(object sender, EventArgs e)
        {
            if (dgvAddressCliente.RowCount == 0)
            {
                MessageBox.Show("No existen registros agregados al detalle", "Sistema FUYAO - Validando Opción", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (dgvAddressCliente.CurrentRow != null) quitarElementoDetalle();
            else
            {
                MessageBox.Show("Seleccione el registro que desee quitar del detalle", "Sistema FUYAO - Validando Opción", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }     
        }

        private void quitarElementoDetalle()
        {
            beCliente.Direccions.Remove((Direccion)dgvAddressCliente.CurrentRow.DataBoundItem);
            dgvAddressCliente.DataSource = null;
            dgvAddressCliente.DataSource = beCliente.Direccions;
            validaExisteAddressxDefault();
        }

        private void validaExisteAddressxDefault()
        {
            if (dgvAddressCliente.RowCount > 0)
            {
                bool _existeAddressDefault=false;
                for (int i = 0; i < dgvAddressCliente.Rows.Count; i++)
                {
                    if (beCliente.Direccions.ElementAt(i).EsPrincipal)
                    {
                        _existeAddressDefault = true;
                        break;
                    }
                }
                if (_existeAddressDefault) return;
                else
                {
                    beCliente.Direccions.ElementAt(0).EsPrincipal = true;
                    beCliente.Direccions.ElementAt(0).IsPrincipalDesc = "SI";
                }
                dgvAddressCliente.DataSource = null;
                dgvAddressCliente.DataSource = beCliente.Direccions;
            }
        }

        private void btnIsPrincipal_Click(object sender, EventArgs e)
        {
            if (dgvAddressCliente.RowCount == 0)
            {
                MessageBox.Show("No existen registros agregados al detalle", "Sistema FUYAO - Validando Opción", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            setIsAddressxDefecto(dgvAddressCliente.CurrentRow.Index);
        }

        private void setIsAddressxDefecto(int indice)
        {
            for (int i = 0; i < dgvAddressCliente.Rows.Count; i++)
            {
                if (i == indice)
                {
                    beCliente.Direccions.ElementAt(i).EsPrincipal = true;
                    beCliente.Direccions.ElementAt(i).IsPrincipalDesc = "SI";
                }
                else
                {
                    beCliente.Direccions.ElementAt(i).EsPrincipal = false;
                    beCliente.Direccions.ElementAt(i).IsPrincipalDesc = "NO";
                }
            }
            dgvAddressCliente.DataSource = null;
            dgvAddressCliente.DataSource = beCliente.Direccions;
        }
    }
}
